#ifndef SQLCONNECTIONPOOL_H
#define SQLCONNECTIONPOOL_H
/*
 *为了支持多线程，使用了 QMutex，QWaitCondition 和 QMutexLocker 来保护共享资源
 * usedConnectionNames 和 unusedConnectionNames 的读写。
 *
*/
#include <QSqlDatabase>
#include <QQueue>
#include <QMutex>
#include <function.h>
#include <QWaitCondition>

class SqlConnectionPool
{
public:
    static bool isDirOrFileExits(QString dbName);
    static bool createSqlitePath(QString path);
    static void release();//关闭所有数据库连接
    static QSqlDatabase openConnection();//获取数据库连接
    static void closeConnection(QSqlDatabase connection);//释放连接回连接池
                                                         // 一般在 main() 函数返回前调用
    ~SqlConnectionPool();
private:
    static SqlConnectionPool& getInstance();//保证在程序运行的时候只有一个对象被创建，getInstance() 用于取得这个唯一的对象。
    SqlConnectionPool();
    SqlConnectionPool(const SqlConnectionPool &other);
    SqlConnectionPool& operator=(const SqlConnectionPool &other);
    QSqlDatabase createConnection(const QString &connectionName); // 创建数据库连接

    QQueue<QString> usedConnectionNames;   // 已使用的数据库连接名
    QQueue<QString> unusedConnectionNames; // 未使用的数据库连接名

    // 数据库信息
    QString hostName;
    QString databasePath;
    QString databaseName;
    QString username;
    QString password;
    QString databaseType;

    bool  testOnBorrow;    // 取得连接的时候验证连接是否有效
    QString testOnBorrowSql; // 测试访问数据库的 SQL

    int maxWaitTime=1000;  // 获取连接最大等待时间
    int waitInterval=100; // 尝试获取连接时等待间隔时间
    int maxConnectionCount=100; // 最大连接数

    static QMutex mutex;
    static QWaitCondition waitConnection;
    static SqlConnectionPool *instance;


};

#endif // SQLCONNECTIONPOOL_H
